package com.tjetc;

public class _10ThreadMessage {
    public static void main(String[] args) {
        /*
            生产者-消费者模型：
            1. 生产者发现其中没有东西就开始生产
            2. 消费者发现其中有东西就开始消费
         */

        // 要创建的产品
        Product product = new Product();
        Producer producer = new Producer(product);
        Consumer consumer = new Consumer(product);
        producer.start();
        consumer.start();
    }
}


// 产品
class Product {
    String name;
    int price;

    // 判断当前产品是否存在
    boolean flag;

    public Product() {
    }

    public Product(String name, int price, boolean flag) {
        this.name = name;
        this.price = price;
        this.flag = flag;
    }
}

// 生产者
class Producer extends Thread {
    Product product;


    public Producer(Product product) {
        this.product = product;
    }

    @Override
    public void run() {
        while (true) {
            // 注意：wait方法和notify 和synchronized 一起使用！！！！
            synchronized (product) {
                // 表示当前没有商品 就要生产
                if (product.flag == false) {
                    product.name = "产品";
                    product.price = 1;
                    // 设置为true 表示生产完毕
                    product.flag = true;
                    System.out.println("当前商品生产完毕！！！");
                    try {
                        sleep(2000);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    // 通知消费者消费
                    product.notify();
                } else {
                    // 当前商品存在 等待消费
                    try {
                        product.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }

    }
}

// 消费者线程
class Consumer extends Thread {
    Product product;

    public Consumer(Product product) {
        this.product = product;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (product) {
                // 表示当前有商品 我就要消费
                if (product.flag == true) {
                    // 这里设置为false 表示消费完毕
                    product.flag = false;
                    System.out.println("当前商品消费完毕！！！");
                    // 通知生产者生产
                    product.notify();
                } else {
                    // 当前商品不存在 等待生产
                    try {
                        product.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }

    }

}

